package handlers

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"

	"iot/sql_models"
)

// ConnectHandler 处理 MQTT "connect" 事件
func ConnectHandler(c *gin.Context) {
	// 获取请求中的 JSON 数据
	var jsonData map[string]interface{}
	if err := c.ShouldBindJSON(&jsonData); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	// 启动 Goroutine 处理连接事件
	go handleConnect(jsonData)

	// 返回响应，防止阻塞
	c.JSON(http.StatusOK, gin.H{"status": "connect event received"})
}

// handleConnect 是异步处理连接事件的函数
func handleConnect(data map[string]interface{}) {
	// fmt.Printf("\n\n\n\n\n\n")
	// fmt.Printf("Handling connect event: %v\n", data)
	clientID := data["clientid"].(string)
	fmt.Printf("ClientID: %v\n", clientID)

	timestamp := parseTimestamp(data, "timestamp")
	fmt.Println("Parsed Time:", timestamp)

	// 使用FirstOrCreate查找或创建ConnectionLog
	connectionLog := sql_models.CreateNewLog(clientID, timestamp)
	if err := sql_models.DB.Where("client_id = ?", clientID).FirstOrCreate(&connectionLog).Error; err != nil {
		fmt.Println("连接数据库失败:", err)
		return 
	}

	// 如果记录已存在，更新连接时间
	if connectionLog.ID != 0 { // 已存在记录，更新日志
		sql_models.UpdateConnectionLog(&connectionLog, timestamp)
		if err := sql_models.DB.Save(&connectionLog).Error; err != nil {
			fmt.Println("更新连接日志失败:", err)
			return 
		}
	}
}
